import {
  HTTP_REQUEST_URL,
  HEADER,
  TOKENNAME,
  HEADERPARAMS,
} from "@/config/app";
import { toLogin } from "./login";
import { Toast } from "./utils.js";
import store from "../store";
/**
 * 发送网络请求
 * @param {string} url - 请求的 API 地址
 * @param {string} method - 请求方法（默认为 'GET'）
 * @param {Object} data - 请求数据（默认为空对象）
 * @param {Object} options - 可选参数，包含 noAuth（是否需要授权）和 params（是否使用特殊 header）
 * @returns {Promise} - 返回 Promise 对象
 */
function baseRequest(url, method = "GET", data = {}, options = {}) {
  const { noAuth = false, params = false } = options;
  let finalHeader = params ? HEADERPARAMS : HEADER;
  const token = uni.getStorageSync("userInfo").token;

  if (!noAuth && !token) {
    // 如果需要授权但没有 token，则跳转到登录页面
    toLogin();
    return Promise.reject(new Error("未登录，请登录后重试"));
  }
  if (!noAuth) {
    // 添加 token 到 header 中
    finalHeader[TOKENNAME] = token;
  }

  return new Promise((resolve, reject) => {
    uni.request({
      url: `${HTTP_REQUEST_URL}${url}`,
      method: method,
      header: finalHeader,
      data: data,
      success: (res) => {
        if (res.statusCode === 200) {
          const { code, ...restData } = res.data;
          if (code === 200 || code === 1) {
            resolve({ data: restData, response: res });
          } else if (code === 401) {
            // 处理 token 无效的情况
            toLogin();
            reject(new Error("Token 无效，请重新登录"));
          } else {
            Toast(res.data.msg);
            reject(new Error(res.data.msg));
          }
        } else {
          reject(new Error("请求失败"));
        }
      },
      fail: (err) => {
        // 请求失败时的处理
        reject(new Error(err.message));
      },
    });
  });
}

// 创建请求方法对象
const requestMethods = [
  "options",
  "get",
  "post",
  "put",
  "head",
  "delete",
  "trace",
  "connect",
];
const request = {};
requestMethods.forEach((method) => {
  request[method.toLowerCase()] = (api, data, options, params) => {
    return baseRequest(api, method, data, options, params);
  };
});

export default request;
